package com.rabbit.videoplayer.widget.gesture

import android.annotation.SuppressLint
import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import kotlin.math.abs

/**
 * 播放控手势控制。通过对view的GestureDetector事件做监听，判断水平滑动还是垂直滑动。
 * 最后的结果通过[GestureView.GestureListener]返回出去。
 * 主要在[GestureView]中使用到此类。
 */
@SuppressLint("ClickableViewAccessibility")
class GestureControl(var mContext: Context, mGestureView: View) {
    /**
     * 是否允许触摸
     */
    private var isGestureEnable = true
    // 是否水平
    private var isInHorizontalGesture = false
    // 是否右边垂直
    private var isInRightGesture = false
    // 是否左边垂直
    private var isInLeftGesture = false
    // 手势决定器
    private var mGestureDetector: GestureDetector? = null
    // 手势监听
    private var mGestureListener: GestureView.GestureListener? = null
    //当前是否处于分屏模式
    private var mIsMultiWindow = false
    private var mView: View? = null

    /**
     * 绑定到GestureDetector的。
     */
    private val mOnGestureListener: GestureDetector.OnGestureListener = object : GestureDetector.OnGestureListener {
        private var mXDown = 0f
        override fun onSingleTapUp(e: MotionEvent): Boolean {
            return false
        }

        override fun onShowPress(e: MotionEvent) {}
        override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
            //如果关闭了手势。则不处理。
            if (!isGestureEnable) {
                return false
            }
            if (abs(distanceX) > abs(distanceY)) { // 水平滑动
                if (isInLeftGesture || isInRightGesture) {
                    // 此前已经是竖直滑动了，不管
                } else {
                    isInHorizontalGesture = true
                }
            } else { // 垂直滑动
            }
            if (isInHorizontalGesture && e1 != null) { // 水平滑动
                mGestureListener?.onHorizontalDistance(e1.x, e2.x)
                return true
            }

            /** 如果是分屏模式,则根据当前展示的View的宽度来计算手势是处于右侧还是左侧  */
            if (mIsMultiWindow && mView != null) {
                if (isInLeft(mXDown.toInt()) && e1 != null) {
                    isInLeftGesture = true
                    mGestureListener?.onLeftVerticalDistance(e1.y, e2.y)
                } else if (isInRight(mXDown.toInt()) && e1 != null) {
                    isInRightGesture = true
                    mGestureListener?.onRightVerticalDistance(e1.y, e2.y)
                }
                return true
            }

            if (isInLeft(mXDown.toInt()) && e1 != null) {
                isInLeftGesture = true
                mGestureListener?.onLeftVerticalDistance(e1.y, e2.y)
            } else if (isInRight(mXDown.toInt()) && e1 != null) {
                isInRightGesture = true
                mGestureListener?.onRightVerticalDistance(e1.y, e2.y)
            }
            return true
        }

        override fun onLongPress(e: MotionEvent) {
            mGestureListener?.onLongPress()
        }

        override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
            return false
        }

        override fun onDown(e: MotionEvent): Boolean {
            mXDown = e.x
            return true
        }


        /**
         * 是否在屏幕右侧
         *
         * @param xPos     位置的x坐标值
         * @return true：是。
         */
        private fun isInRight(xPos: Int): Boolean {
            val screenWidth = com.blankj.utilcode.util.ScreenUtils.getScreenWidth()
            return xPos > screenWidth / 2
        }

        /**
         * 是否在屏幕左侧
         *
         * @param xPos     位置的x坐标值
         * @return true：是。
         */
        private fun isInLeft(xPos: Int): Boolean {
            val screenWidth = com.blankj.utilcode.util.ScreenUtils.getScreenWidth()
            return xPos < screenWidth / 2
        }



    }

    init {
        mGestureDetector = GestureDetector(mContext, mOnGestureListener)
        mGestureView.setOnTouchListener { _, event ->
            when (event.action) {
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    //对结束事件的监听
                    isInLeftGesture = false
                    isInRightGesture = false
                    isInHorizontalGesture = false
                    mGestureListener?.onGestureEnd()
                }
                else -> {}
            }
            //其他的事件交给GestureDetector。
            return@setOnTouchListener mGestureDetector?.onTouchEvent(event)?:false
        }

        //GestureDetector增加双击事件的监听。。里面包含了单击事件
        mGestureDetector?.setOnDoubleTapListener(object : GestureDetector.OnDoubleTapListener {
            override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
                //处理点击事件
                mGestureListener?.onSingleTap()
                return false
            }

            override fun onDoubleTap(e: MotionEvent): Boolean {
                mGestureListener?.onDoubleTap()
                return false
            }

            override fun onDoubleTapEvent(e: MotionEvent): Boolean {
                return false
            }
        })
    }


    /**
     * 是否支持多窗口
     * @param isMultiWindow 支持
     */
    fun setMultiWindow(isMultiWindow: Boolean) {
        mIsMultiWindow = isMultiWindow
    }

    fun setView(view: View?) {
        mView = view
    }


    /**
     * 开启关闭手势控制。
     *
     * @param enable 开启
     */
    fun enableGesture(enable: Boolean) {
        isGestureEnable = enable
    }

    /**
     * 设置手势监听事件
     * @param mGestureListener 手势监听事件
     */
    fun setOnGestureControlListener(mGestureListener: GestureView.GestureListener?) {
        this.mGestureListener = mGestureListener
    }


}